// I:\java\estore\estore\service\ProductService.java
package com.estore.service;

import com.estore.model.Product;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Arrays;
import java.util.HashSet;
// 增加的导入：用于数据持久化功能
import java.io.*;
// 增加的内容：导入 Properties 类以解决无法解析符号 'Properties' 的问题
import java.util.Properties;

public class ProductService {

    // 使用Map存储商品数据，key是商品ID，value是商品对象
    // 优点：通过ID查找商品时，时间复杂度是O(1)，非常高效
    private final Map<String, Product> productData = new HashMap<>();

    // 增加的内容：添加数据文件路径属性，用于存储从配置文件中读取的路径
    private String dataFilePath = "products.dat";

    /**
     * 构造函数，初始化一些商品数据
     */
    public ProductService() {
        // 增加的内容：在构造函数中首先调用 loadConfig() 方法加载配置
        loadConfig();
        // 增加的内容：在构造函数最开始调用 loadData() 方法
        loadData();
        productData.put("p001", new Product("p001", "Java从入门到精通", 99.0, 100,new HashSet<>(Arrays.asList("学习"))));
        productData.put("p002", new Product("p002", "高性能MySQL", 128.5, 50));
        productData.put("p003", new Product("p003", "颈椎康复指南", 45.0, 200, new HashSet<>(Arrays.asList("养生"))));
        productData.put("p004", new Product("p004", "生发秘籍", 88.0, 0)); // 库存为0的商品
        productData.put("p005", new Product("p005", "Python从入门到精通", 69.0, 30));
    }


    /**
     * 获取所有商品列表
     * @return 商品列表
     */
    public List<Product> getAllProducts() {
        // 从Map的值集合创建一个新的ArrayList并返回
        return new ArrayList<>(productData.values());
    }

    /**
     * 获取排序后的商品列表
     * @param sortBy 排序方式: "price_asc", "price_desc", "name", "stock"
     * @return 排序后的商品列表
     */
    public List<Product> getSortedProducts(String sortBy) {
        List<Product> products = getAllProducts();

        switch (sortBy) {
            case "price_asc":
                products.sort(Comparator.comparingDouble(Product::getPrice));
                break;
            case "price_desc":
                products.sort(Comparator.comparingDouble(Product::getPrice).reversed());
                break;
            case "name":
                products.sort(Comparator.comparing(Product::getName));
                break;
            case "stock":
                products.sort(Comparator.comparingInt(Product::getStock).reversed());
                break;
            default:
                products.sort(Comparator.comparing(Product::getId));
                break;
        }

        return products;
    }

    /**
     * 根据ID查找商品
     * @param id 商品ID
     * @return 找到的商品对象，如果不存在则返回null
     */
    public Product findProductById(String id) {
        return productData.get(id);
    }

    // 增加的内容：loadConfig() 方法 - 加载配置文件
    public void loadConfig() {
        // 创建 Properties 对象用于加载配置文件
        Properties props = new Properties();
        try (InputStreamReader isr = new InputStreamReader(new FileInputStream("config.properties"), "UTF-8")) {
            // 加载配置文件
            props.load(isr);
            // 从配置文件中读取 data.file.path 的值，如果不存在则使用默认值
            dataFilePath = props.getProperty("data.file.path", "products.dat");
        } catch (IOException e) {
            // 如果配置文件不存在或读取出错，输出错误信息并使用默认路径
            System.err.println("加载配置文件时出错: " + e.getMessage());
            System.out.println("使用默认数据文件路径: " + dataFilePath);
        }
    }

    // 修改的内容：saveData() 方法 - 使用配置文件中的路径保存数据到文件
    public void saveData() {
        // 修改的内容：使用从配置文件中读取的 dataFilePath 路径替代硬编码的 "products.dat"
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(dataFilePath))) {
            oos.writeObject(productData); // 将整个Map对象写入文件
        } catch (IOException e) {
            System.err.println("保存数据时出错: " + e.getMessage());
            e.printStackTrace();
        }
    }

    // 修改的内容：loadData() 方法 - 使用配置文件中的路径从文件加载数据
    @SuppressWarnings("unchecked")
    public void loadData() {
        // 修改的内容：使用从配置文件中读取的 dataFilePath 路径替代硬编码的 "products.dat"
        File dataFile = new File(dataFilePath);
        if (!dataFile.exists()) {
            System.out.println("数据文件不存在，将创建新的数据文件");
            return;
        }

        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(dataFilePath))) {
            Map<String, Product> loadedData = (Map<String, Product>) ois.readObject();
            productData.clear(); // 清空现有数据
            productData.putAll(loadedData); // 恢复数据
        } catch (IOException | ClassNotFoundException e) {
            System.err.println("加载数据时出错: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
